package fr.thelem.gestiondemandesthelem.service.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.lang3.StringUtils;

/**
 * Utilitaires de gestion de chaines de caractères.
 */
public class StringParseUtil {

	/**
	 * Découpe la chaine par virgule puis par whitespaces
	 * 
	 * @param chaine
	 *            chaine
	 * @return Liste créée
	 */
	public static List<String> splitParVirgulePuisParWhiteSpaces(String chaine) {
		List<String> temp = new ArrayList<String>();
		List<String> splitVirgule = splitParVirguleAvecIntervales(chaine);
		for (String string : splitVirgule) {
			List<String> splitWhiteSpaces = splitParEspacesEtRetours(string);
			for (String string2 : splitWhiteSpaces) {
				temp.add(string2);
			}
		}
		return temp;
	}

	/**
	 * A partir d'une chaine contenant plusieurs éléments séparés par des
	 * espaces et/ou des retours à la ligne retourne une liste de chaines
	 * séparés par ces caractères.
	 * <p>
	 * {@code  splitParEspacesEtRetours("A560 B563 \n A555\nB699 E563");}
	 * <p>
	 * Resultat sous forme de liste : ["A560","B563","A555","B699","E563"]
	 * 
	 * @deprecated A terme le séparateur devrait être le caractère '|'
	 * 
	 * @param valeur
	 *            valeur a parser
	 * @return liste des valeurs séparées
	 */
	@Deprecated
	public static List<String> splitParEspacesEtRetours(String valeur) {
		List<String> listeValeurs = new ArrayList<String>();

		for (String string : StringUtils.split(StringUtils.trimToEmpty(valeur),
				"\n")) {
			for (String string2 : StringUtils.split(
					StringUtils.trimToEmpty(string), " ")) {
				for (String string3 : StringUtils.split(
						StringUtils.trimToEmpty(string2), "\r")) {
					for (String string4 : StringUtils.split(
							StringUtils.trimToEmpty(string3), "\t")) {
						listeValeurs.add(string4);
					}
				}

			}
		}
		return listeValeurs;
	}

	/**
	 * Découpe une chaine par le séparateur virgules. Si un intervale d'entiers
	 * est détécté, génère les valeurs intermédiaires.
	 * <p>
	 * <b>ex:</b>
	 * {@literal "123, 125, 126-128" -> ["123","125","126","127","128"]}
	 * 
	 * @param valeur
	 *            chaine
	 * @return {@literal List<String>}
	 */
	public static List<String> splitParVirguleAvecIntervales(String valeur) {
		List<String> resultat = new ArrayList<String>();
		List<String> asList = Arrays.asList(StringUtils.split(
				StringUtils.normalizeSpace(StringUtils.trimToEmpty(valeur)),
				","));
		for (String string : asList) {
			if (string.contains("-")) {
				String[] intervalle = StringUtils.split(string, "-");
				Integer borneInferieure = Integer.valueOf(StringUtils
						.trim(intervalle[0]));
				Integer borneSuperieure = Integer.valueOf(StringUtils
						.trim(intervalle[1]));
				for (int i = borneInferieure; i <= borneSuperieure; i++) {
					resultat.add(String.valueOf(i));
				}
			} else {
				resultat.add(StringUtils.trim(string));
			}
		}

		return resultat;
	}

	/**
	 * Remplace les retours à la ligne par des espaces et trim la chaine.
	 * 
	 * @param cellStringValue
	 *            chaine de caractères
	 * @return valeur formatée
	 */
	public static String trimRetourLignes(String cellStringValue) {
		return StringUtils
				.trim(StringUtils.replace(cellStringValue, "\n", " "));
	}

	/**
	 * Supprime les caractères de part et d'autre d'une chaine de caractères. Et
	 * la passe en majuscule.
	 * 
	 * @param string
	 *            chaine
	 * @return la chaine formatée, null si la chaine en entrée est null
	 */
	public static String trimUpper(String string) {
		return StringUtils.trim(StringUtils.upperCase(string));
	}
}
